home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / dev / lang / sofa.lha / sofa / smalleiffel / lib_se / e_strip.e < prev    next >
Text File  |  2000-03-25  |  11KB  |  410 lines

  1. --          This file is part of SmallEiffel The GNU Eiffel Compiler.
  2. --          Copyright (C) 1994-98 LORIA - UHP - CRIN - INRIA - FRANCE
  3. --            Dominique COLNET and Suzanne COLLIN - colnet@loria.fr
  4. --                       http://SmallEiffel.loria.fr
  5. -- SmallEiffel is  free  software;  you can  redistribute it and/or modify it
  6. -- under the terms of the GNU General Public License as published by the Free
  7. -- Software  Foundation;  either  version  2, or (at your option)  any  later
  8. -- version. SmallEiffel is distributed in the hope that it will be useful,but
  9. -- WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  10. -- or  FITNESS FOR A PARTICULAR PURPOSE.   See the GNU General Public License
  11. -- for  more  details.  You  should  have  received a copy of the GNU General
  12. -- Public  License  along  with  SmallEiffel;  see the file COPYING.  If not,
  13. -- write to the  Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  14. -- Boston, MA 02111-1307, USA.
  15. --
  16. class E_STRIP
  17.    --
  18.    -- To store a strip expression like :
  19.    --                                        strip(foo, bar)
  20.    --
  21.  
  22. inherit EXPRESSION;
  23.  
  24. creation make
  25.  
  26. feature
  27.  
  28.    current_type: TYPE;
  29.          -- Context of this expression.
  30.  
  31.    start_position: POSITION;
  32.  
  33. feature {NONE}
  34.  
  35.    list: FEATURE_NAME_LIST;
  36.  
  37.    make(sp: like start_position; l: like list) is
  38.       require
  39.          not sp.is_unknown
  40.       do
  41.          start_position := sp;
  42.          list := l;
  43.       ensure
  44.          start_position = sp;
  45.          list = l
  46.       end;
  47.  
  48. feature
  49.  
  50.    is_current: BOOLEAN is false;
  51.  
  52.    is_writable: BOOLEAN is false;
  53.  
  54.    is_manifest_string: BOOLEAN is false;
  55.  
  56.    is_manifest_array: BOOLEAN is false;
  57.  
  58.    is_result: BOOLEAN is false;
  59.  
  60.    is_void: BOOLEAN is false;
  61.  
  62.    use_current: BOOLEAN is true;
  63.  
  64.    can_be_dropped, c_simple: BOOLEAN is false;
  65.  
  66.    is_static: BOOLEAN is false;
  67.  
  68.    is_pre_computable: BOOLEAN is false;
  69.  
  70.    isa_dca_inline_argument: INTEGER is 0;
  71.  
  72.    static_result_base_class: BASE_CLASS is
  73.       do
  74.          Result := small_eiffel.get_class(as_array);
  75.       end;
  76.  
  77.    static_value: INTEGER is
  78.       do
  79.       end;
  80.  
  81.    dca_inline_argument(formal_arg_type: TYPE) is
  82.       do
  83.       end;
  84.  
  85.    assertion_check(tag: CHARACTER) is
  86.       do
  87.       end;
  88.  
  89.    afd_check is
  90.       local
  91.          rf2: RUN_FEATURE_2;
  92.          i: INTEGER;
  93.          st, dt: TYPE;
  94.          fd: DICTIONARY[RUN_FEATURE,STRING];
  95.       do
  96.          fd := current_type.run_class.feature_dictionary;
  97.          from
  98.             i := 1;
  99.          until
  100.             i > fd.count
  101.          loop
  102.             rf2 ?= fd.item(i);
  103.             if rf2 /= Void then
  104.                if list = Void or else not list.has(rf2.name) then
  105.                   st := rf2.result_type;
  106.                   if st.is_expanded then
  107.                      dt := st.actual_reference(type_any);
  108.                      conversion_handler.passing(st,dt);
  109.                   end;
  110.                end;
  111.             end;
  112.             i := i + 1;
  113.          end;
  114.       end;
  115.  
  116.    mapping_c_target(target_type: TYPE) is
  117.       do
  118.          compile_to_c;
  119.       end;
  120.  
  121.    mapping_c_arg(formal_arg_type: TYPE) is
  122.       do
  123.          compile_to_c;
  124.       end;
  125.  
  126.    collect_c_tmp is
  127.       do
  128.       end;
  129.  
  130.    compile_to_c is
  131.       local
  132.          wa: ARRAY[RUN_FEATURE_2]
  133.          rf2: RUN_FEATURE_2;
  134.          i: INTEGER;
  135.          ct, st, dt: TYPE;
  136.       do
  137.          manifest_array_pool.c_call(result_type);
  138.          cpp.put_character('(');
  139.          ct := current_type;
  140.          wa := ct.run_class.writable_attributes;
  141.          vwst1_check(wa);
  142.          cpp.put_integer(array_count(wa));
  143.          if wa /= Void then
  144.             from
  145.                i := wa.upper;
  146.             until
  147.                i = 0
  148.             loop
  149.                rf2 := wa.item(i);
  150.                if list = Void or else not list.has(rf2.name) then
  151.                   cpp.put_character(',');
  152.                   st := rf2.result_type;
  153.                   if st.is_expanded then
  154.                      dt := st.actual_reference(type_any);
  155.                      conversion_handler.c_function_call(st,dt);
  156.                   end;
  157.                   cpp.print_current;
  158.                   if current_type.is_expanded then
  159.                      cpp.put_character('.');
  160.                   else
  161.                      cpp.put_string("->");
  162.                   end;
  163.                   cpp.put_character('_');
  164.                   cpp.put_string(rf2.name.to_string);
  165.                   if st.is_expanded then
  166.                      cpp.put_character(')');
  167.                   end;
  168.                end;
  169.                i := i - 1;
  170.             end;
  171.          end;
  172.          cpp.put_character(')');
  173.       end;
  174.  
  175.    c_declare_for_old is
  176.       do
  177.       end;
  178.  
  179.    compile_to_c_old is
  180.       do
  181.       end;
  182.  
  183.    compile_to_jvm_old is
  184.       do
  185.       end;
  186.  
  187.    compile_to_jvm is
  188.       local
  189.          ca: like code_attribute;
  190.          cp: like constant_pool;
  191.          count, i, j, idx, idx_array, space: INTEGER;
  192.          wa: ARRAY[RUN_FEATURE_2]
  193.          rf2: RUN_FEATURE_2;
  194.       do
  195.          ca := code_attribute;
  196.          cp := constant_pool;
  197.          wa := current_type.run_class.writable_attributes;
  198.          count := array_count(wa);
  199.          result_type.run_class.jvm_basic_new;
  200.          ca.opcode_dup;
  201.          ca.opcode_iconst_1;
  202.          idx_array := result_type.run_class.jvm_constant_pool_index;
  203.          idx := cp.idx_fieldref4(idx_array,as_lower,fz_i);
  204.          ca.opcode_putfield(idx,-2);
  205.          ca.opcode_dup;
  206.          ca.opcode_push_integer(count);
  207.          idx := cp.idx_fieldref4(idx_array,as_upper,fz_i);
  208.          ca.opcode_putfield(idx,-2);
  209.          ca.opcode_dup;
  210.          ca.opcode_push_integer(count);
  211.          idx := cp.idx_fieldref4(idx_array,as_capacity,fz_i);
  212.          ca.opcode_putfield(idx,-2);
  213.          if count > 0 then
  214.             -- pile = array
  215.             ca.opcode_push_integer(count);
  216.             type_any.jvm_xnewarray;
  217.             -- pile = array storage
  218.             ca.opcode_dup2;
  219.             -- pile = array storage array storage
  220.             tmp_string.clear;
  221.             tmp_string.extend('[');
  222.             tmp_string.append(jvm_root_descriptor);
  223.             idx := cp.idx_fieldref4(idx_array,as_storage,tmp_string);
  224.             ca.opcode_putfield(idx,-2);
  225.             -- pile = array storage
  226.             from
  227.                i := wa.upper;
  228.                j := 0;
  229.             until
  230.                i = 0
  231.             loop
  232.                rf2 := wa.item(i);
  233.                if list = Void or else not list.has(rf2.name) then
  234.                   if j < count - 1 then
  235.                      ca.opcode_dup;
  236.                   end;
  237.                   ca.opcode_push_integer(j);
  238.                   current_type.jvm_push_local(0);
  239.                   idx := cp.idx_fieldref(rf2);
  240.                   ca.opcode_getfield(idx,0);
  241.                   space := rf2.result_type.jvm_convert_to(type_any);
  242.                   result_type.jvm_xastore;
  243.                   j := j + 1;
  244.                end;
  245.                i := i - 1;
  246.             end;
  247.          end;
  248.       end;
  249.  
  250.    compile_target_to_jvm is
  251.       do
  252.       end;
  253.  
  254.    jvm_branch_if_false: INTEGER is
  255.       do
  256.       end;
  257.  
  258.    jvm_branch_if_true: INTEGER is
  259.       do
  260.       end;
  261.  
  262.    compile_to_jvm_into(dest: TYPE): INTEGER is
  263.       do
  264.          Result := 1;
  265.          compile_to_jvm;
  266.       end;
  267.  
  268.    result_type: TYPE_ARRAY is
  269.       do
  270.          if result_type_memory = Void then
  271.             !!result_type_memory.make(start_position,type_any);
  272.             result_type_memory := result_type_memory.to_runnable(type_any);
  273.             result_type_memory.run_class.set_at_run_time;
  274.             result_type_memory.load_basic_features;
  275.             manifest_array_pool.register(result_type_memory);
  276.          end;
  277.          Result := result_type_memory;
  278.       end;
  279.  
  280.    to_runnable(ct: TYPE): like Current is
  281.       do
  282.          if current_type = Void then
  283.             current_type := ct;
  284.             Result := Current;
  285.          else
  286.             !!Result.make(start_position,list);
  287.             Result := Result.to_runnable(ct);
  288.          end;
  289.       end;
  290.  
  291.    stupid_switch(r: ARRAY[RUN_CLASS]): BOOLEAN is
  292.       do
  293.       end;
  294.  
  295.    pretty_print is
  296.       do
  297.          fmt.put_string("strip (");
  298.          fmt.level_incr;
  299.          if list /= Void then
  300.             list.pretty_print;
  301.          end;
  302.          fmt.put_string(")");
  303.          fmt.level_decr;
  304.       end;
  305.  
  306.    print_as_target is
  307.       do
  308.          pretty_print;
  309.          fmt.put_character('.');
  310.       end;
  311.  
  312.    bracketed_pretty_print is
  313.       do
  314.          fmt.put_character('(');
  315.          pretty_print;
  316.          fmt.put_character(')');
  317.       end;
  318.  
  319.    short is
  320.       do
  321.          short_print.hook_or("op_strip","strip (");
  322.          if list /= Void then
  323.             list.short;
  324.          end;
  325.          short_print.hook_or("cl_strip",")");
  326.       end;
  327.  
  328.    short_target is
  329.       do
  330.          short;
  331.          short_print.a_dot;
  332.       end;
  333.  
  334.    precedence: INTEGER is
  335.       do
  336.          Result := 11;
  337.       end;
  338.  
  339.    jvm_assign is
  340.       do
  341.       end;
  342.  
  343. feature {NONE}
  344.  
  345.    vwst1: STRING is "This is not an attribute of Current (VWST.1)."
  346.  
  347.    vwst1_check(wa: ARRAY[RUN_FEATURE_2]) is
  348.       local
  349.          i, j: INTEGER;
  350.          fn: FEATURE_NAME;
  351.          rf2: RUN_FEATURE_2;
  352.       do
  353.          if wa = Void then
  354.             if list = Void then
  355.             else
  356.                eh.add_position(list.item(1).start_position);
  357.                eh.append(vwst1);
  358.                eh.print_as_error;
  359.             end;
  360.          elseif list /= Void then
  361.             from
  362.                i := list.count;
  363.             until
  364.                i = 0
  365.             loop
  366.                fn := list.item(i);
  367.                from
  368.                   j := wa.upper;
  369.                   rf2 := Void;
  370.                until
  371.                   j <= 0
  372.                loop
  373.                   rf2 := wa.item(j);
  374.                   if rf2.name.to_string = fn.to_string then
  375.                      j := -1;
  376.                   else
  377.                      j := j - 1;
  378.                   end;
  379.                end;
  380.                if j = 0 then
  381.                   eh.add_position(fn.start_position);
  382.                   eh.append(vwst1);
  383.                   eh.print_as_error;
  384.                end;
  385.                i := i - 1;
  386.             end;
  387.          end;
  388.       end;
  389.  
  390.    result_type_memory: like result_type;
  391.  
  392.    array_count(wa: ARRAY[RUN_FEATURE_2]): INTEGER is
  393.       do
  394.          if wa /= Void then
  395.             Result := wa.count;
  396.          end;
  397.          if list /= Void then
  398.             Result := Result - list.count;
  399.          end;
  400.       ensure
  401.          Result >= 0
  402.       end;
  403.  
  404.    tmp_string: STRING is
  405.       once
  406.          !!Result.make(32);
  407.       end;
  408.  
  409. end -- E_STRIP
  410.